package com.example.dragandview.kugou;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.HorizontalScrollView;
import android.widget.ImageView;


import androidx.core.view.ViewCompat;

import com.example.dragandview.R;

import static com.example.dragandview.kugou.ScreenUtils.getScreenWidth;

public class KGSlidingView extends HorizontalScrollView {
    // 菜单的宽度
    private int mMenuWidth;

    private View mContentView,mMenuView;
    // 7.手指快速滑动 - 手势处理类
    private GestureDetector mGestureDetector;

    // 7.手指快速滑动 - 菜单是否打开
    private boolean mMenuIsOpen = false;
    // 是否拦截
    private boolean mIntercept = false;

    // 9.1.2.2 把阴影加入新的内容容器  - 阴影View
    private ImageView mShadowView;

    public KGSlidingView(Context context) {
        this(context,null);
    }

    public KGSlidingView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public KGSlidingView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //获取自定义属性
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.KGSlidingView);
        float rightMargin = typedArray.getDimension(R.styleable.KGSlidingView_menuRightMargin,ScreenUtils.dip2px(context, 50));
        // 菜单页的宽度是 = 屏幕的宽度 - 右边的一小部分距离（自定义属性）
        mMenuWidth = (int) (getScreenWidth(context) - rightMargin);
        typedArray.recycle();
        mGestureDetector = new GestureDetector(context, new GestureListener());

    }

    private class GestureListener extends GestureDetector.SimpleOnGestureListener{
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            // Log.e(TAG,velocityX+"");
            // Bug  判断左右还是上下   只有左右快速滑动才切换
            if(Math.abs(velocityY) > Math.abs(velocityX)){
                // 代表上下快速划  这个时候不做处理
                return super.onFling(e1, e2, velocityX, velocityX);
            }

            // 向右边快速滑动 是一个 大于 0 的数
            // 向左边快速滑动 是一个 小于 0 的数
            // 逻辑  如果是菜单打开  向左边快速滑动的时候 应该切换菜单状态
            if(mMenuIsOpen){
                if(velocityX < 0){
                    toggleMenu();
                    return true;
                }
            }
            //       如果是菜单关闭  向右边快速滑动的时候 应该切换菜单状态
            else{
                if(velocityX > 0){
                    toggleMenu();
                    return true;
                }
            }
            return super.onFling(e1, e2, velocityX, velocityY);
        }
    }

    /**
     * 7.切换菜单的状态
     */
    public void toggleMenu() {
        if(mMenuIsOpen){
            closeMenu();
        }else{
            openMenu();
        }
    }

    // 1.宽度不对（乱套了），指定宽高
    @Override
    protected void onFinishInflate() {
        // 这个方法是布局解析完毕也就是 XML 布局文件解析完毕
        super.onFinishInflate();
        // 指定宽高 1.内容页的宽度是屏幕的宽度
        // 获取LinearLayout
        ViewGroup container = (ViewGroup) getChildAt(0);
        int childCount = container.getChildCount();
        if (childCount != 2) {
            throw new RuntimeException("只能放置两个子View!");
        }
        mMenuView = container.getChildAt(0);
        ViewGroup.LayoutParams menuViewLayoutParams = mMenuView.getLayoutParams();
        menuViewLayoutParams.width = mMenuWidth;
        mMenuView.setLayoutParams(menuViewLayoutParams);

        mContentView = container.getChildAt(1);
        ViewGroup.LayoutParams indexLayoutParames = mContentView.getLayoutParams();
        container.removeView(mContentView);
        FrameLayout newContentView = new FrameLayout(getContext());
        newContentView.addView(mContentView);
        mShadowView = new ImageView(getContext());
        mShadowView.setBackgroundColor(Color.parseColor("#99000000"));
        newContentView.addView(mShadowView);
        container.addView(newContentView);
        indexLayoutParames.width = getScreenWidth(getContext());
        newContentView.setLayoutParams(indexLayoutParames);
        //没用
//        scrollTo(mMenuWidth,0);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {

        super.onLayout(changed, l, t, r, b);
        scrollTo(mMenuWidth,0);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (mIntercept){
            return true;
        }
        // 7.2 处理手指快速滑动  手势处理类使用  拦截
        if(mGestureDetector.onTouchEvent(ev)){
            return false;
        }

        if (ev.getAction() == MotionEvent.ACTION_UP){
            int currentScrollx = getScrollX();
            if(currentScrollx > mMenuWidth/2){
                // 关闭
                closeMenu();
            }else{
                // 打开
                openMenu();
            }
            return true;
        }
        return super.onTouchEvent(ev);
    }
    private void closeMenu(){
        smoothScrollTo(mMenuWidth,0);
        mMenuIsOpen = false ;
    }
    private void openMenu(){
        smoothScrollTo(0,0);
        mMenuIsOpen = true ;
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        Log.e("TAG", "l -> " + l);// 变化是 mMenuWidth - 0
        // 算一个梯度值
        float scale = 1f * l / mMenuWidth;// scale 变化是 1 - 0
        float alphaScale = 1 - scale;
        mShadowView.setAlpha(alphaScale);
        // 右边的缩放: 最小是 0.7f, 最大是 1f
        float rightScale = 0.7f + 0.3f * scale;

        // 设置右边的缩放,默认是以中心点缩放
        // 设置缩放的中心点位置
        ViewCompat.setPivotX(mContentView,0);
        ViewCompat.setPivotY(mContentView, mContentView.getMeasuredHeight() / 2);
        ViewCompat.setScaleX(mContentView,rightScale);
        ViewCompat.setScaleY(mContentView, rightScale);

        // 菜单的缩放和透明度
        // 透明度是 半透明到完全透明  0.5f - 1.0f
        float leftAlpha = 0.1f + (1-scale) * 0.9f;
        ViewCompat.setAlpha(mMenuView,leftAlpha);

        float leftScale = 0.7f + (1-scale) * 0.3f;
        ViewCompat.setScaleX(mMenuView,leftScale);
        ViewCompat.setScaleY(mMenuView,leftScale);

        // 最后一个效果 退出这个按钮刚开始是在右边，安装我们目前的方式永远都是在左边
        // 设置平移，先看一个抽屉效果
//         ViewCompat.setTranslationX(mMenuView,l);
        // 平移 l*0.7f
        ViewCompat.setTranslationX(mMenuView, 0.25f*l);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        mIntercept  = false ;
        if (mMenuIsOpen){
            float currentX = ev.getX();
            if(currentX > mMenuWidth){
                closeMenu();
                mIntercept = true;
                //子view不需要响应任何事件
                return true;
            }
        }
        return super.onInterceptTouchEvent(ev);
    }
}
